package com.dferreira.axil.service;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.Collection;
import java.util.List;
import java.util.logging.Logger;

import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.persistence.EntityManager;

public abstract class CadastroAbstrato<Entidade> implements Cadastro<Entidade> {

    @Inject
    private Logger log;

    @Inject
    private EntityManager em;

    @Inject
    private Event<Entidade> eventSrc;
	
	@Override
	public Entidade salvar(Entidade entidade) {
		log.info("Salvando " + getEntityClass().getSimpleName());
		em.persist(entidade);
		eventSrc.fire(entidade);
		return entidade;
	}

	@Override
	public void salvarTodos(Collection<Entidade> entidades) {
		for (Entidade entidade : entidades)
			salvar(entidade);
	}

	@Override
	public void excluir(Entidade entidade) {
		log.info("Excluindo " + getEntityClass().getSimpleName());
		em.remove(em.merge(entidade));
		eventSrc.fire(entidade);
	}

	@Override
	public void excluirTodos(Collection<Entidade> entidades) {
		for (Entidade entidade : entidades)
			excluir(entidade);
	}

	@Override
	public Entidade findById(Serializable id) {
		return (Entidade) em.find(getEntityClass(), id);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Entidade> findAll() {
		return em.createQuery("FROM " + getEntityClass().getName()).getResultList();
	}

	@Override
	public List<Entidade> getAll() {
		return findAll();
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	protected Class<Entidade> getEntityClass() {
		return (Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}
	
	@Override
	public List<Entidade> findByExample(Entidade entidade) {
		// TODO Auto-generated method stub
		return null;
	}
	
}
